The Haunted DAG & The Causal Terror

library(here)
source(here::here("code/scripts/source.R"))
slides_dir = here::here("docs/slides/L06")
slides_dir = here::here("docs/slides/L07")

The classic confound involves some exposure $E$. A lot of research goes into understanding what the returns on education are. There are a lot of confounds $U$. How do we de-confound this DAG using the back-door criterion? $E \leftarrow  U \rightarrow W$. How to shut this? It's a fork, and you close it by conditioning on $U$. But here it's unobserved, so we can't condition on it. You therefore can't get an unbiased estimate. But that's an achievement, because we've wasted less time. 
don't know how to handle 'marginfigure' engine output

LS0tCnRpdGxlOiAiQ2hhcHRlciA2LiBUaGUgSGF1bnRlZCBEQUcgJiBUaGUgQ2F1c2FsIFRlcnJvciIKZGF0ZTogJ2ByIGZvcm1hdChTeXMuRGF0ZSgpKWAnCiNvdXRwdXQ6CiMgIGh0bWxfZG9jdW1lbnQ6CiMgICAgdG9jOiB0cnVlCiMgICAgdG9jX2Zsb2F0OiB0cnVlCiMgICAgZGV2OiAnc3ZnJwojICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKIyAgICBwYW5kb2NfYXJnczogLS1sdWEtZmlsdGVyPWNvbG9yLXRleHQubHVhCiMgICAgaGlnaGxpZ2h0OiBweWdtZW50cwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKI291dHB1dDoKIyAgYm9va2Rvd246OnR1ZnRlX2h0bWxfYm9vazoKIyAgICB0b2M6IHllcwojICAgIGNzczogdG9jLmNzcwojICAgIHBhbmRvY19hcmdzOiAtLWx1YS1maWx0ZXI9Y29sb3ItdGV4dC5sdWEKIyAgICBoaWdobGlnaHQ6IHB5Z21lbnRzCiMgICAgbGluay1jaXRhdGlvbnM6IHllcwotLS0KCiMgVGhlIEhhdW50ZWQgREFHICYgVGhlIENhdXNhbCBUZXJyb3IKCmBgYHtyLCBtZXNzYWdlID0gRiwgd2FybmluZz1GfQpsaWJyYXJ5KGhlcmUpCnNvdXJjZShoZXJlOjpoZXJlKCJjb2RlL3NjcmlwdHMvc291cmNlLlIiKSkKYGBgCgpgYGB7cn0Kc2xpZGVzX2RpciA9IGhlcmU6OmhlcmUoImRvY3Mvc2xpZGVzL0wwNiIpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJSd9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMDEucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiSW50ZXJlc3RpbmcgZmVhdHVyZSBvZiBzY2llbnRpZmljIGxpdGVyYXR1cmUgaXMgdGhhdCB0aGVyZSdzIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBzdXJwcmlzaW5nIHRoaW5ncyBhbmQgdHJ1ZSB0aGluZ3MuIFRoZSBtb3N0IHRydXN0d29ydGh5IHNjaWVuY2UgaXMgaW5jcmVkaWJseSBib3JpbmcuIFBhcGVyIGZyb20gUE5BUy4gSHVycmljYW5lcyBnZXQgbmFtZXMuIFRoZXkgaGFkIHRoaXMgY29udmVudGlvbiBvZiBhbHRlcm5hdGluZyBuYW1lcy4gWW91IGNhbiByZWdyZXNzIHRoZW0sIGFuZCBpZiB5b3UgZG8gYSB0ZXJyaWJsZSByZWdyZXNzaW9uLCBmZW1hbGUgaHVycmljYW5lcyBhcmUgZGVhZGxpZXIsIGJ1dCBpdCdzIG5vdCByb2J1c3QuIEFuZCB0aGVyZSdzIG5vIHJvYnVzdCBtZWNoYW5pc20uIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcwNS5wbmcnKSkKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJUaGlzIGlzIE1vbm8gTGFrZSwgd2l0aCBoaWdoIGxldmVscyBvZiBhcnNlbmljLiBXaHkncyB0aGF0IGJhZD8gQXJzZW5hdGUgbWltaWNzIHBob3NwaGF0ZSwgYW5kIHRoaW5ncyBicmVhay4gSG93IGRvIHRoZSBvcmdhbmlzbXMgaW4gdGhpcyBsYWtlIGFkYXB0IHRvIGl0PyBEciBXb2xmZS1TaW1vbiBwdWJsaXNoZWQgYSBzdHVkeSBzaG93aW5nIGV2aWRlbmNlIHRoYXQgYmFjdGVyaWEgaW4gdGhlIGxha2Ugd2VyZSB1c2luZyBhcnNlbmljIGluIHRoZWlyIEROQS4gU2luY2UgdGhlbiBpdCB0dXJucyBvdXQgaXQgcHJvYmFibHkgd2Fzbid0IHRydWUsIGV2ZW4gdGhvdWdoIGl0IHdhcyBhIHJpZ29yb3VzIHN0dWR5LiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMDYucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiV2UgZG9uJ3QgbmVlZCBhbnkgZWxhYm9yYXRlIHRoZW9yeSB0aGF0IHdlIGFsbCBoYXZlLiBBbGwgeW91IG5lZWQgdG8gZ2V0IGEgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBuZXdzd29ydGh5IHRoaW5ncyBhbmQgdHJ1c3R3b3J0aHkgdGhpbmdzIGFyZSBwZWVyLXJldmlldy4gSGVyZSdzIGEgc2ltdWxhdGVkIGV4YW1wbGUuIEltYWdpbmUgdGhhdCBlaXRoZXIgam91cm5hbHMgb3IgZ3JhbnQtcmV2aWV3IHBhbmVscywgeW91IGNhcmUgYWJvdXQgYm90aC4gQnV0IHlvdSBhbHNvIGNhcmUgYWJvdXQgcmlnb3VyLiBBIHN0dWR5IGNhbiBnZXQgcHVibGlzaGVkIG9yIGZ1bmRpbmcgKmlmKiBpdCdzIHN1ZmZpY2llbnRseSB0cnVzdHdvcnRoeSAqb3IqIGl0J3Mgc3VmZmljaWVudGx5IG5ld3N3b3J0aHkuIFNvIGV2ZW4gaXQgdGhlcmUncyBubyBjb3JyZWxhdGlvbiBpbiB0aGUgcHJvZHVjdGlvbiBvZiBzY2llbmNlLCBwb3N0LXNlbGVjdGlvbiB0aGVyZSdsbCBiZSBhIG5lZ2F0aXZlIGNvcnJlbGF0aW9uLiBIZXJlIHlvdSBjYW4gc2VlIHRoZXJlJ3Mgbm8gY29ycmVsYXRpb24uIFRoZXJlJ3MgYSB0aHJlc2hvbGQgb2YgdGhlIHN1bSBvZiBuZXdzd29ydGhpbmVzcyBhbmQgdHJ1c3Rvd3J0aGluZXNzLiBUaGUgYmx1ZSBhcmUgdGhlIG9uZXMgdGhhdCBnZXQgZnVuZGVkLCBhbmQgdGhlIGNvcnJlbGF0aW9ucyBhcmUgLTAuOC4gWW91IGNhbid0IGtub3cgZnJvbSB0aGUgY29ycmVsYXRpb24gd2hhdCdzIGhhcHBlbmluZyBnZW5lcmF0aXZlbHkuIFRoaXMgaXMgYSBzcHVyaW91cyBjb3JyZWxhdGlvbi4gQ29uZGl0aW9uaW5nIG9uIGEgdmFyaWFibGUgaW4gYSByZWdyZXNzaW9uIGlzIGEgc2VsZWN0aW9uIHByb2Nlc3MuIERvbid0IGp1c3QgYWRkIHRoaW5ncyB0byByZWdyZXNzaW9ucy4gSXQncyBjYWxsZWQgYSBTaW1wc29uJ3MgcGFyYWRveC4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzA3LnBuZycpKQpgYGAKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIlJlZ3Jlc3Npb24gaXMgYW4gaW5jcmVkaWJsZSB0b29sLiBCdXQgaXQncyBhbiBvcmFjbGUuIEl0IGF1dG9tYXRpY2FsbHkgZmluZHMgdGhlIG1vc3QgaW5mb3JtYXRpdmUgY2FzZXMuIEl0J3MgYW1hemluZyB0aGF0IHRoZSB1bml2ZXJzZSBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgdGhpcyB3b3JrcyBvdXQuIEJ1dCBpdCdzIGEgaGlzdG9yaWNhbCBvcmFjbGUuIExpa2UgdGhlIE9yYWNsZSBvZiBEZWxwaGkuIFBvd2VmdWwsIGJ1dCBub3QgYmVuaWduLiBPciBsaWtlIGEgZ2VuaWUuIFdpbGwgdGFrZSB5b3VyIHdpc2ggKHF1ZXN0aW9uKSB2ZXJ5IGxpdGVyYWxseS4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzA4LnBuZycpKQpgYGAKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIlwiVGFibGUgMlwiOiB1bmludGVycHJldGFibGUgY2F1c2FsIHNhbGFkLiBBZGRpbmcgdmFyaWFibGUgY2FuIGNyZWF0ZSBjb25mb3VuZHMuIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcwOS5wbmcnKSkKYGBgCgoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiR29pbmcgdG8gdXNlIGEgbG90IG9mIHNpbXVsYXRlZCBleGFtcGxlcy4gQWN0dWFsbHkgdGhlcmUncyB0aGlzIGJlbmlnbiBmYWN0IHRoYXQgdGhlcmUgYXJlIG9ubHkgZm91ciBjb25mb3VuZHMuIElnbm9yaW5nIHRob3NlIHRoaW5ncywgdGhlc2UgYXJlIHRoZSBvbmx5IGtpbmRzIHdlIGdldC4gR29pbmcgdG8gZXhwbGFpbiBlYWNoIG9mIHRoZW0gdG8gc2VlIHdoYXQgdGhleSBkby4gR29pbmcgdG8gbGVhcm4gaG93IHRvIGRlLWNvbmZvdW5kIGVhY2ggb2YgdGhlbS4gSWYgeW91IGtub3cgdGhlIGNhdXNhbCBncmFwaCwgeW91IGNhbiBkZWNvbmZvdW5kIG9yIGNvbmNsdWRlIHRoYXQgaXQncyBob3BlbGVzcyBhbmQgY2FuJ3QgY29uZm91bmQuIFNvIHdlJ2xsIGNvbWUgYmFjayB0byB0aGlzLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMTAucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiVGhlIG1vc3QgZmFtb3VzIGNvbmZvdW5kLiBWYXJpYWJsZSB0aGF0IGlzIGEgY29tbW9uIGNhdXNlIG9mIHR3byBvdGhlcnMuIE1lZGlhbiBhZ2Ugb2YgbWFycmlhZ2UgY3JlYXRlcyBhIGZvcmsuIENyZWF0ZXMgYSBzcHVyaW91cyBjb3JyZWxhdGlvbiBiZXR3ZWVuIE0gYW5kIEQuIEludGVyZXN0ZWQgaW4gdGhlIGNhdXNhbCBlZmZlY3Qgb2YgWCBvbiBZLiBJbiB0aGUgZm9yaywgeW91IGRlY29uZm91bmQgYnkgY29uZGl0aW9uaW5nIG9uIFogYW5kIHNodXQgdGhlIGZvcmsuIFRoZXJlJ3MgdGhpcyBub3RhdGlvbiBhdCB0aGUgYm90dG9tIG9mIHRoZSBzbGlkZS4gWCBpcyBpbmRlcGVuZGVudCBvbiBZIGNvbmRpdGlvbmFsIG9uIFouIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcxMS5wbmcnKSkKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJUaGUgcGlwZSBpcyBhIGxvdCBsaWtlIHRoZSBmb3JrLiBIZXJlIHRoZXJlJ3MgYSBtZWRpYXRpb24uIEluIHJlYWxpdHkgWCBpcyBtZWRpYXRlZCBieSBaLiBJZiB3ZSBjb25kaXRpb24gb24gWiwgd2UgZG9uJ3Qgbm90aWNlIHRoZSB0cnVlIGVmZmVjdC4gSWYgeW91IGNvbmRpdGlvbiBvbiBaLCB0aGVuIHlvdSByZW1vdmUgdGhlIGRlcGVuZGVuY3kgYmV0d2VlbiBYIGFuZCBZLiBGcm9tIHRoZSBkYXRhIGFsb25lLCB5b3UgY2FuJ3Qgc2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBwaXBlIGFuZCBhIGZvcmsuICJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMTIucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiVGhlIGNvbmZvdW5kIHRoYXQgZ2V0cyBjcmVhdGVkIGlzIHRoZSBcInBvc3QtdHJlYXRtZW50IGJpYXNcIiwgWi4gUG9zdC10cmVhdG1lbnQgdmFyaWFibGVzIGFyaXNlIGFzIGEgY29uc2VxdWVuY2Ugb2YgdHJlYXRtZW50LiBUaGlzIGhhcHBlbnMgYSBsb3QuIFRoZSBiaWFzIG9jY3VycyB3aGVuIHlvdSdyZSBub3QgYXdhcmUgb2YgWiwgYW5kIGVuZCB1cCBpbmZlcnJpbmcgc29tZXRoaW5nIHdyb25nLiAifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzEzLnBuZycpKQpgYGAKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIkxldCdzIGltYWdpbmUgYW4gZXhwZXJpbWVudCB3aGVyZSB0aGVyZSdzIGZ1bmdhbCBncm93dGggaW4gYSBncmVlbmhvdXNlLCBhbmQgeW91IGhhdmUgYW4gYW50aS1mdW5nYWwgdHJlYXRtZW50LCBhbmQgeW91IHJhbmRvbWx5IGFzc2lnbiBwbGFudHMgdG8gZWl0aGVyIHRoZSB0cmVhdG1lbnQgb3IgY29udHJvbC4gVGhlIGluaXRpYWwgaGVpZ2h0IG9mIHRoZSBwbGFudCBpcyBIMC4gVGhlIGFudGktZnVuZ2FsIHRyZWF0bWVudCBpcyB1cHN0cmVhbSBmcm9tIHRoZSBmdW5ndXMsIGJ1dCBkb2Vzbid0IGluZmx1ZW5jZSBpdCBkaXJlY3RseS4gV2hhdCBoYXBwZW5zIGhlcmUgaW4gYSByZWdyZXNzaW9uIGlzIGlmIHlvdSBtZWFzdXJlIGZ1bmd1cyAtIHdoaWNoIGlzIGhvdyB5b3UgdGVzdCBmb3IgbWVkaWF0aW9uIC0gYnV0IHdoYXQgeW91J3JlIGludGVyZXN0ZWQgaW4gaXMgdGhlIGZ1bGwgcGF0aCBmcm9tIFQgdG8gSDEuIElmIHlvdSBjb25kaXRpb24gb24gRiwgaXQnbGwgbG9vayBsaWtlIHRoZSB0cmVhdG1lbnQgZG9lc24ndCB3b3JrLiBJZiB5b3UgY29uZGl0aW9uIG9uIEYsIHlvdSBibG9jayB0aGUgcGlwZSwgYW5kIGluZm9ybWF0aW9uIGRvZXNuJ3QgZmxvdyBmcm9tIFQgdG8gSDEuIEluIG9ic2VydmF0aW9uYWwgc3R1ZGllcywgdGhlIHRlcnJvciBpcyByZWFsLiAifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzE0LnBuZycpKQpgYGAKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIkZydXN0cmF0aW5nIHRoaW5nIGZvciBzdGF0aXN0aWNpYW5zIGlzIHRoYXQgaWYgeW91IGNvbmRpdGlvbiBvbiBjYXJlZXIgY2hvaWNlLCB0aGVyZSdzIGJhc2ljYWxseSBubyB3YWdlIGdhcC4gQnV0IHRoYXQgZG9lc24ndCBtZWFuIGdlbmRlciBhbmQgcmFjZSBpc24ndCBjYXVzYWwsIGJlY2F1c2UgdGhlcmUgYXJlIHN0cmVhbXMgd2hlcmUgc29tZXRoaW5nIGRvd25zdHJlYW0ga25vY2tzIGl0IG91dC4gSWYgeW91IGxvb2sgYXQgZnVuZGluZyByYXRlcyBmb3IgdGhlIHNjaWVuY2VzLCB3b21lbiBnZXQgd2F5IGxlc3MgZ3JhbnQgbW9uZXkuIEJ1dCBub3QgaWYgeW91IGNvbmRpdGlvbiBvbiBmaWVsZC4gIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcxNS5wbmcnKSkKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJUaGlzIGlzIHdoZXJlIHRoZSBzZWxlY3Rpb24gZWZmZWN0IGNvbWVzIGZyb20uIExpa2UgdGhlIGZvcmsgYnV0IGluIHJldmVyc2UuIEhlcmUgYFpgIGlzIGEgY29tbW9uIHJlc3VsdCBvZiBgWGAgYW5kIGBZYC4gWCBhbmQgWSBhcmUgcmVhbGx5IGluZGVwZW5kZW50LCBidXQgaWYgeW91IGNvbmRpdGlvbiBvbiBaLCBpdCBjcmVhdGVzIGEgc3B1cmlvdXMgY2F1c2FsIGNvbm5lY3Rpb24gYmV0d2VlbiBYIGFuZCBZLiBUaGVyZSdzIHRoaXMgXCJmaW5kaW5nIG91dFwiIGVmZmVjdC4gIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcxNi5wbmcnKSkKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcxNy5wbmcnKSkKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJUaGlzIGlzIHRoZSBmaW5kaW5nIG91dCBlZmZlY3QuIFdvcmtzIGZvciBjb250aW51b3VzIHZhcmlhYmxlcyBhcyB3ZWxsLiAifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzE4LnBuZycpKQpgYGAKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzE5LnBuZycpKQpgYGAKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIkJvdGggaW5mbHVlbmNlIHB1YmxpY2F0aW9uLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMjAucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiU28gaWYgaXQncyBiZWVuIHB1Ymxpc2hlZCBpbiBOYXR1cmUgYW5kIGlzbid0IHRydXN0d29ydGh5LCBjYW4geW91IHRlbGwgbWUgaG93IG5ld3N3b3J0aHkgaXQgaXM/In0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcyMS5wbmcnKSkKYGBgCgoKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIlRoZXJlIGFyZSBsb3RzIG9mIGVmZmVjdHMgbGlrZSB0aGlzIHRoYXQgaGFwcGVuIGFsbCB0aGUgdGltZS4gQmVpbmcgdGFsbCBpcyBkZWZpbml0ZWx5IGNhdXNhdGl2ZWx5LXNwZWFraW5nIGFuIGFkdmFudGFnZS4gVGhlIHRhbGxlciB5b3UgYXJlLCB0aGUgZWFzaWVyIHRvIHNjb3JlIGZpZWxkIGdvYWxzLiBCdXQgY29uZGl0aW9uYWwgb24gYmVpbmcgYSBwcm9mZXNzaW9uYWwgcGxheWVyLCB0aGVyZSdzIG5vIGNvcnJlbGF0aW9uIGJldHdlZW4gaGVpZ2h0IGFuZCBzaG9vdGluZyBwZXJjZW50YWdlLiBCZWNhdXNlIHRoZSBzaG9ydGVyIHBsYXllcnMgYXJlIGNvbXBlbnNhdGluZyBieSBiZWluZyBhbWF6aW5nIGluIG90aGVyIHdheXMuIFRoZXkndmUgYmVlbiBkaXN0b3J0ZWQgYnkgdGhlIHNlbGVjdGlvbiBlZmZlY3RzLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMjIucG5nJykpCmBgYAoKCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJMZXQncyBkbyBhbiBleGFtcGxlLiBJbWFnZSB0aGlzIGNhdXNhbCBncmFwaCBhdCB0aGUgYm90dG9tLiBJbWFnaW5lIGl0J3MgdHJ1ZSB0aGF0IGdldHRpbmcgbWFycmllZCBpcyBwb3NpdGl2ZWx5LCBjYXVzYWxseSBhc3NvY2lhdGVkIHdpdGggaGFwcGluZXNzLCBhbmQgYWdlLiBOb3cgb3VyIHF1ZXN0aW9uIGlzLCBpcyB0aGVyZSBhbnkgY2F1c2FsIGltcGFjdCBvZiBhZ2Ugb24gaGFwcGluZXNzPyBIZXJlJ3MgYSBzaW11bGF0aW9uIHdoZXJlIGl0J3MgdG90YWxseSBzcHVyaW91cy4gIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcyMy5wbmcnKSkKYGBgCgoKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIkhlcmUgdGhlIHNpbXVsYXRpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSB1c3VhbCBgcm5vcm1gLiBIZXJlJ3MgdGhlIGFsZ29yaXRobS4gVW5pZm9ybSBoYXBwaW5lc3MgYXQgYmlydGguIERpc3RyaWJ1dGVkIGZyb20gMCB0byAxLiBSZWFsaXR5IGlzIG1vcmUgY29tcGxpY2F0ZWQsIGV2ZW4gaGFyZGVyIHRvIGZpZ3VyZSBvdXQuIEF0IDE4IHllYXJzIG9sZCwgeW91J3JlIGVsaWdpYmxlIHRvIG1hcnJ5LiBUaGVuIHlvdSBoYXZlIHlvdXIgY29pbi1mbGlwIGNoYW5jZSB0byBnZXQgbWFycmllZC4gVGhlIGNoYW5jZSBpcyBwcm9wb3J0aW9uYWwgdG8geW91ciBoYXBwaW5lc3MsIHdoaWNoIGlzIGNvbnN0YW50LiBBZ2UgaXRzZWxmIGRvZXNuJ3QgY2F1c2UgbWFycmlhZ2UsIGJ1dCBlYWNoIHllYXIgeW91J3JlIGFsaXZlIHlvdSBoYXZlIGFub3RoZXIgY2hhbmNlIHRvIGdldCBtYXJyaWVkLiBNYXJyaWVkIHBlb3BsZSByZW1haW4gbWFycmllZCB1bnRvIGRlYXRoLiBUaGVuIGV2ZXJ5b25lIG1vdmVzIHRvIFNwYWluLiAxMzAwIHBlb3BsZSwgMyB2YXJpYWJsZXMsIG92ZXIgMTAwMCB5ZWFycy4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzI0LnBuZycpKQpgYGAKCgoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiSGVyZSdzIHRoZSBzeXN0ZW0uIFJ1biBhIHJlZ3Jlc3Npb24gd2hlcmUgd2UgdGFrZSBoYXBwaW5lc3MuIEhhcHBpbmVzcyBpcyB0aGUgb3V0Y29tZSwgdGhlbiB0aGUgbGluZWFyIG1vZGVsIGBtdWAsIHRoZSBzbG9wZSBgYWAgd2hpY2ggaXMgYWdlLiBUaGF0J3MgdGhlIGV4cG9zdXJlIHdlJ3JlIGludGVyZXN0ZWQgaW4uIEFuZCB3ZSBrbm93IHRoZSBtYXJyaWFnZSBzdGF0dXMsIHNvIHBlcmhhcHMgd2UgY29udHJvbCBmb3IgdGhhdC4gKE5vLCB0aGF0J3MgdGhlIHdyb25nIHRoaW5nIHRvIGRvLCBhcyB3ZSdsbCBzZWUuKSBDcmVhdGVkIGFuIGluZGV4IHZhcmlhYmxlLiBUaGVuIHB1dCB0aGF0IGluIGFzIGEgY29udHJvbC4gV2Ugc2VlIHRoYXQgc2luZ2xlIHBlb3BsZSBhcmUgbGVzcyBoYXBweS4gUmVncmVzc2lvbiBtb2RlbHMgZG9uJ3QgaGF2ZSBhcnJvd3MuIEl0J3Mgbm90IGluIHRoZSBCYXllc2lhbiBuZXR3b3JrOyB0aGF0J3Mgd2hhdCB0aGUgREFHIGRvZXMuIGBhWzJdYCBpcyBtYXJyaWVkIGluZGl2aWR1YWxzLiBQb3NpdGl2ZSBgbXVgLiBUaGUgc2xvcGUgaXMgc29saWRseSBuZWdhdGl2ZS4gQnV0IHRoaXMgaXMgYSBzcHVyaW91cyBjb3JyZWxhdGlvbiBieSBjb25kaXRpb25pbmcgb24gYSBjb2xsaWRlci4gIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcyNS5wbmcnKSkKYGBgCgoKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIldlIGtub3cgdGhhdCBoYXBwaW5lc3MgZG9lc24ndCBjaGFuZ2UgYW5kIGRvZXNuJ3QgZGVjbGluZSB3aXRoIGFnZSwgYmVjYXVzZSB0aGF0J3MgaG93IHdlIGNvZGVkIGl0LiBCdXQgaWYgd2Ugc3RyYXRpZnkgYnkgbWFycmlhZ2Ugc3RhdHVzLCBpdCBkb2VzLiBFYWNoIHBvaW50IGlzIGEgcGVyc29uLiBFYWNoIHllYXIgMjAgaW5kaXZpZHVhbHMgYXJlIGJvcm4uIEhhcHBpbmVzcyBpcyB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgYW5kIGNvbnN0YW50LiBCbHVlIGZpbGxlZCBhcmUgbWFycmllZC4gU3RhcnRpbmcgZWFybHkgb24gdGhlIGJsdWUgcG9pbnRzIGFyZSBvbmx5IGF0IHRoZSB0b3AuIEJ1dCBvdmVyIHRpbWUsIGluZGl2aXVhbHMgd2hvIGFyZSBsZXNzIGhhcHB5IHdpbGwgYWxzbyBnZXQgbWFycmllZC4gQnkgNjUsIG1vc3Qgb2YgdGhlIHBvcHVsYXRpb24gaW4gdGhlIHNpbXVsYXRpb24gaXMgbWFycmllZC4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzI2LnBuZycpKQpgYGAKCiAKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIk5vdyBpZiB3ZSBkcmF3IHJlZ3Jlc3Npb24gbGluZXMsIHdlIGNhbiBzZWUgdGhlcmUncyBhIG5lZ2F0aXZlIGNvcnJlbGF0aW9uLiBCdXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBoYXBwaW5lc3MgaGFzIG5vdCBjaGFuZ2VkIGZvciBhbnlib2R5LiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMjcucG5nJykpCmBgYAoKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIklmIHdlIGNvbmRpdGlvbiBvbiBpdCwgd2UgYWxsb3cgaW5mb3JtYXRpb24gdG8gZmxvdyBmcm9tIGFnZSB0byBoYXBwaW5lc3MuIEluIHJlYWxpdHkgd2UgZG9uJ3Qga25vdywgc28gd2UgbmVlZCB0byB1c2UgaW5mb3JtYXRpb24gZXh0ZXJuYWwgdG8gdGhlIGRhdGEuICJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMjgucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgID0gIkFub3RoZXIgZXhhbXBsZS4gQ29sbGlkZXJzIGFyZSBzbyBwb3dlcmZ1bCB0aGV5IGNhbiBldmVuIG9jY3VyIHdoZW4geW91IGhhdmVuJ3QgbWVhc3VyZWQgdGhlIGNvbmZvdW5kZXIuIEluIG15IHN1YmZpZWxkLCB3ZSdyZSBpbnRlcmVzdGVkIGluIGFsbG9wYXRlcm5hbCBlZmZlY3RzLiBXaGF0IGlzIHRoZSBtYXRlcmlhbCBiZW5lZml0IG9mIGhhdmluZyBncmFuZHBhcmVudHM/IFRoZXJlIGFyZSByZXNvdXJjZSBhbmQgaW5mb3JtYXRpb24gZmxvd3MsIHNvIHdlIHdhbnQgdG8gZmlndXJlIG91dCBob3cgaW1wb3J0YW50IHRoZXkgYXJlLiBIb3cgZG8geW91IGZpZ3VyZSB0aGlzIG91dCBlbXBpcmljYWxseT8gU2F5IHlvdSBoYXZlIHRyaWFkcywgYW5kIHlvdSdyZSBsb29raW5nIGF0IGVkdWNhdGlvbmFsIG91dGNvbWVzLiBJbmRpcmVjdCBwYXRoIHRocm91Z2ggUCwgc2F5IHRocm91Z2ggYm9va3MuIEJ1dCBhbHNvIGEgcG90ZW50aWFsIGRpcmVjdCBlZmZlY3RzIGR1cmluZyBzYXkgYmFieXNpdHRpbmcuIEJ1dCByZWdyZXNzaW9ucyBjYW4gc2hvdyB0aGF0IGdyYW5kcGFyZW50cyBoYXZlIGEgbmVnYXRpdmUgZWZmZWN0PyJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMjkucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiSXQncyBwbGF1c2libGUgdGhhdCBwYXJlbnRzIGFuZCBjaGlsZHJlbiBzaGFyZSB1bm9ic2VydmVkIGNvbmZvdW5kcy4gV2hlbmV2ZXIgeW91IGRvIG9ic2VydmF0aW9uYWwgc3R1ZGllcywgdGhlcmUgYXJlIGBVYHMgYWxsIG92ZXIgdGhlIHBsYWNlLiBlLmcuIHRoZSBuZWlnaGJvdXJob29kIHlvdSBsaXZlIGluLiBTY2hvb2wgYW5kIG5laWdoYm91cmhvb2QgZWZmZWN0cyBhcmUgcmVhbGx5IHBvd2VyZnVsLiBNYWtlcyBwYXJlbnRzIGludG8gYSBjb2xsaWRlci4gU28gaWYgd2UgY29uZGl0aW9uIG9uIHBhcmVudHMsIGl0IGJlY29tZXMgYSBjb2xsaWRlci4gIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICczMC5wbmcnKSkKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJTbyB3ZSBzaW11bGF0ZSB0aGlzLiBBc3N1bWluZyB0aGF0IHRoZSBkaXJlY3QgcGF0aCBpcyAwLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMzEucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiV2UgZW5kIHVwIGNvbmNsdWRpbmcgdGhhdCBncmFuZHBhcmVudHMgaHVydCB0aGVpciBraWRzLiBIb3cgZG9lcyB0aGlzIHdvcms/IENvbmRpdGlvbmluZyBvbiBhIGNvbGxpZGVyIG9wZW5zIGEgcGF0aC4gSXQncyBjbG9zZWQgYnkgZGVmYXVsdC4gVGhpcyBvZXBucyBhIHBhdGggZnJvbSBHIHRocm91Z2ggVSB0byBzZWUsIHdoaWNoIGNyZWF0ZXMgYSBzcHVyaW91cyBjb3JyZWxhdGlvbi4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzMyLnBuZycpKQpgYGAKCgoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiT25lIHdheSB0byB0aGluayBhYm91dCB0aGlzIGlzIG9uIHRoZSBsZWZ0IHdlIGhhdmUgZ29vZCBuZWlnaGJvdXJob29kcyBpbiBibHVlLiBBbGwgZmlsbGVkIGluIHBvaW50cyBhcmUgd2hlcmUgdGhlIHBhcmVudHMgYXJlIGluIGEgcGFydGljdWxhciBzdHJhdHVtLiBXaHkgaXMgaXQgbmVnYXRpdmU/IEZvY3VzIG9ubHkgb24gcGFyZW50cyBpbiB0aGUgbmFycm93IHJhbmdlIG9mIGVkdWNhdGlvbmFsIG91dGNvbWVzLiBQYXJlbnRzIGluIHRoZSBnb29kIG5laWdoYm91cmhvb2RzLCB0byBiZSB3aXRoaW4gdGhpcyByYW5nZSwgdGhleSBtdXN0IGhhdmUgaGFkIGxlc3MgZWR1Y2F0ZWQgZ3JhbmRwYXJlbnRzLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gYmVjb21lIGEgaGlnaGx5LWVkdWNhdGVkIHBhcmVudC4gRWl0aGVyIHlvdSBhcmUgaW4gYSBnb29kIG5laWdoYm91cmhvb2QsIG9yIHlvdSBoYWQgYW4gZWR1Y2F0ZWQgcGFyZW50IHlvdXJzZWxmLiBFYWNoIGVuZCB0aGUgUCBib3guICJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMzMucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiVGhlIGJhY2sgZG9vciBjcml0ZXJpb24gaXMgdGhhdCB5b3Ugd2FudCB0byBmaWd1cmUgb3V0IHRoZSB0cnVlIGNhdXNhbCBpbXBhY3Qgb24gc29tZSBvdXRjb21lLCB5b3UgbmVlZCB0byBzaHV0IGFsbCBiYWNrZG9vciBwYXRocyBmcm9tIHRoZSB0cmVhdG1lbnQgdG8gdGhlIG91dGNvbWUuIFdlIGhhdmUgdG8gc2h1dCB0aGF0IGFycm93IG9mZiB0byBpbmZlciBhIHRydWUgY2F1c2FsIGVmZmVjdC4gSW4gZXhwZXJpbWVudHMgeW91IHNodXQgYWxsIHRoZSBiYWNrZG9vciBwYXRocyBieSByYW5kb21pc2luZy4gQnV0IGluIG9ic2VydmF0aW9uYWwgc3R1ZGllcywgeW91IHdhbnQgc29tZSBzZXQgb2YgY3JpdGVyaWEgZm9yIHdoYXQgdmFyaWFibGVzIHlvdSBzaG91bGQgaW5jbHVkZSB0byBzaHV0IHRoZSBwYXRocy4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzM0LnBuZycpKQpgYGAKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIlRoZXNlIGFyZSB0aGUgb25seSB3YXlzIHRoYXQgdmFyaWFibGVzIGludGVyYWN0IGluIHRoZXNlIGdyYXBocy4gIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICczNS5wbmcnKSkKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICczNi5wbmcnKSkKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJ30Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICczNy5wbmcnKSkKYGBgCgpgYGB7cn0Kc2xpZGVzX2RpciA9IGhlcmU6OmhlcmUoImRvY3Mvc2xpZGVzL0wwNyIpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJSd9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMDEucG5nJykpCmBgYAoKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIllvdSBjYW4gc29sdmUgY2F1c2FsIGluZmVyZW5jZSBieSBhc3N1bWluZyB0aGUgREFHIGlzIHRydWUuIFRoZXJlIGlzIGEgZnJhbWV3b3JrIHRoYXQgdW5pdGVzIGFsbCB0aGVzZSBleGFtcGxlczogdGhlICoqYmFjay1kb29yIGNyaXRlcmlvbioqLiBXZSBuZWVkIHRvIHNodXQgYWxsIHRoZSBiYWNrIGRvb3IgcGF0aHMgaW50byB0aGUgZXhwb3N1cmUuIFRoZXJlIGFyZSBvbmx5IHJlYWxseSB0aHJlZSBkaWZmZXJlbnQgd2F5cyB0aGV5IGNhbiBtZWV0IGluIHRoZSBEQUcuIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcwMi5wbmcnKSkKYGBgCgoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiQnJlYWsgdGhlIGZvcmsgYnkgY29uZGl0aW9uaW5nIG9uIFouIEJsb2NrIHRoZSBwaXBlIGJ5IGNvbmRpdGlvbmluZyBvbiBaLiBUaGUgY29sbGlkZXIgb25seSBvcGVucyB0aGUgcGF0aCBpZiB5b3UgY29uZGl0aW9uIG9uIGl0LiBDb25kaXRpb25pbmcgb24gYSBkZXNjZW5kYW50IG9mIGEgY29sbGlkZXIgaXMgbGlrZSBjb25kaXRpb25pbmcgb24gYSBjb2xsaWRlciwgZGVwZW5kaW5nIG9uIGhvdyBzdHJvbmcgdGhlIHJlbGF0aW9uc2hpcCBpcy4gIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcwMy5wbmcnKSkKYGBgCgoKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzA0LnBuZycpKQpgYGAKCmBgYHttYXJnaW5maWd1cmV9ClRoZSBjbGFzc2ljIGNvbmZvdW5kIGludm9sdmVzIHNvbWUgZXhwb3N1cmUgJEUkLiBBIGxvdCBvZiByZXNlYXJjaCBnb2VzIGludG8gdW5kZXJzdGFuZGluZyB3aGF0IHRoZSByZXR1cm5zIG9uIGVkdWNhdGlvbiBhcmUuIFRoZXJlIGFyZSBhIGxvdCBvZiBjb25mb3VuZHMgJFUkLiBIb3cgZG8gd2UgZGUtY29uZm91bmQgdGhpcyBEQUcgdXNpbmcgdGhlIGJhY2stZG9vciBjcml0ZXJpb24/ICRFIFxsZWZ0YXJyb3cgIFUgXHJpZ2h0YXJyb3cgVyQuIEhvdyB0byBzaHV0IHRoaXM/IEl0J3MgYSBmb3JrLCBhbmQgeW91IGNsb3NlIGl0IGJ5IGNvbmRpdGlvbmluZyBvbiAkVSQuIEJ1dCBoZXJlIGl0J3MgdW5vYnNlcnZlZCwgc28gd2UgY2FuJ3QgY29uZGl0aW9uIG9uIGl0LiBZb3UgdGhlcmVmb3JlIGNhbid0IGdldCBhbiB1bmJpYXNlZCBlc3RpbWF0ZS4gQnV0IHRoYXQncyBhbiBhY2hpZXZlbWVudCwgYmVjYXVzZSB3ZSd2ZSB3YXN0ZWQgbGVzcyB0aW1lLiAKYGBgCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJJZiB3ZSB3YW50IHRvIGVzdGltYXRlIHRoZSBkaXJlY3QgY2F1c2FsIGluZmx1ZW5jZSBmcm9tIGdyYW5kcGFyZW50cyB0byBraWRzLCB3ZSBzZWUgdGhlcmUgYXJlIHRocmVlIHBhdGhzIGZyb20gRyB0byBDLiBJZiB3ZSBjb25kaXRpb24gb24gJFAkLCB0aGF0IGNsb3NlcyB0aGUgc2Vjb25kIHBhdGggdGhyb3VnaCBwYXJlbnRzLiBTaW5jZSB0aGF0J3MgYSBwaXBlLCB5b3UgY29uZGl0aW9uIG9uIHBhcmVudHMsIGJ1dCB0aGF0IG9wZW5zIHRoZSBvdGhlciBwYXRoLCBiZWNhdXNlIHRoZXkncmUgYSBjb2xsaWRlciBiZXR3ZWVuIGdyYW5kcGFyZW50cyBhbmQgdW5vYnNlcnZlZCBuZWlnaGJvdXJob29kIGVmZmVjdHMuIFNvIHdlIGNhbid0IGdldCBhIHZhbGlkIGVzdGltYXRlIHVubGVzcyB3ZSBtZWFzdXJlIGl0LiBUaGlzIGlzIGhhcHB5IG5ld3MsIGJlY2F1c2Ugd2Uga25vdyB3ZSdyZSBiZWluZyBmb29sZWQuIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcwNS5wbmcnKSkKYGBgCgoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiV2Ugd2FudCB0byBrbm93IHRoZSBjYXVzYWwgZWZmZWN0IG9mICRYJCBvbiAkWSQuIFdlIGhhdmUgYW4gdW5vYnNlcnZlZCBjYXVzZSBvZiAkWCQsIHRoZW4gdGhyZWUgY292YXJpYXRlcy4gV2hhdCBkbyB5b3UgbmVlZCB0byBjb25kaXRpb24gb24sIGFuZCB3aGF0IHNob3VsZCB5b3UgYWJzb2x1dGVseSBub3QgY29uZGl0aW9uIG9uPyBUaGUgYmFja2Rvb3IgY3JpdGVyaW9uIGlzIHN1ZmZpY2llbnQgdG8gZmlndXJlIGl0IG91dC4gRmluZCBlYWNoIGJhY2tkb29yIHBhdGgsIGFuZCBmaWd1cmUgb3V0IHdoaWNoIG9uZXMgdG8gb3BlbiBhbmQgY2xvc2UuIEp1c3QgdGhyZWUgcGF0aHMuIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcwNi5wbmcnKSkKYGBgCgoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiV2hhdCBzaG91bGQgd2UgcHJlZmVyIGJldHdlZW4gQSBvciBDPyBKdXN0IHBpY2sgdGhlIG9uZSB0aGF0J3MgbWVhc3VyZWQgYmV0dGVyLiBCeSB0aGUgd2F5LCB5b3UgbmVlZCBib3RoIGdvb2QgZXN0aW1hdGlvbiwgYW5kIGEgY2F1c2FsIGZyYW1ld29yay4gQm90aCBhcmUgbmVjZXNzYXJ5LiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMDcucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiU3RhdGlzdGljYWwgYXNzb2NhdGlvbiBiZXR3ZWVuIFdhZmZsZSBIb3VzZXMgYW5kIGRpdm9yY2UgcmF0ZS4gV2hhdCBkbyB3ZSBuZWVkIHRvIGNvbnRyb2wgZm9yIHRvIHJlbW92ZSBzcHVyaW91cyBjYXVzYXRpb24/IFNhbWUgZWxlbWVudGFsIGNvbmZvdW5kcyBhcyBiZWZvcmUuIEJhY2tkb29yIGludG8gV2FmZmxlIEhvdXNlcyB0aHJvdWdoIFNvdXRoLiBXaGF0IGRvIHdlIGhhdmUgdG8gZG8gdG8gZXN0aW1hdGUgdGhlIGNhdXNhbCBpbXBhY3Qgb2YgV2FmZmxlcz8gQ29tZSBvdXQgdGhlIGJhY2tkb29yIG9mIFdhZmZsZSBIb3VzZSwgYW5kIGZpbmQgYWxsIHRoZSBwYXRocyB0byBnZXQgdG8gRC4gSXQncyBzdWZmaWNpZW50IHRvIGNvbmRpdGlvbiBvbiBBIGFuZCBNIHRvby4gQnV0IGl0J3Mgc3VmZmljaWVudCB0byBqdXN0IGNvbmRpdGlvbiBvbiBTLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMDgucG5nJykpCmBgYAoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJSd9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMDkucG5nJykpCmBgYAoKCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJHb29kIG5ld3MuIFRoZXJlIGFyZSBhIG51bWJlciBvZiBwYWNrYWdlcyB3aGVyZSB5b3UgZ2l2ZSB0aGVtIHRoZSBEQUcsIGFuZCB0aGVuIHlvdSBjYW4gZ2V0IGl0IHRvIGFsZ29yaXRobWljYWxseSB0ZWxsIHlvdSB0aGluZ3MgYWJvdXQgdGhlIERBRy4gWW91IGNhbiB0ZXN0IHlvdXIgREFHLCBidSBpbnNwZWN0aW5nIHRoZSBpbXBsaWVkIGNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcy4gVGhlIGNhdXNhbCBzdHJ1Y3R1cmUgaW1wbGllcyB0aGF0IHNvbWUgdGhpbmdzIGFyZSBpbmRlcGVuZGVudCBvbiBvdGhlcnMuIEEgYW5kIFcgc2hvdWxkIGhhdmUgbm8gY29ycmVsYXRpb24gYWZ0ZXIgY29uZGl0aW9uaW5nIG9uIFMuIEl0J3MgYSBmb3JrIGZyb20gUy4gUGFydHMgb2YgdGhlIERBRyBtYXkgYmUgd3JvbmcuIEl0J3MgYSBnb29kIGxlc3NvbiB0aGF0IHRoZSBhbnN3ZXJzIHJlcXVpcmUgdGhlIGRhdGEsIGJ1dCBhcmVuJ3QgaW4gdGhlIGRhdGEuIn0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZS5wYXRoKHNsaWRlc19kaXIsICcxMC5wbmcnKSkKYGBgCgoKCmBgYHtyLCBlY2hvID0gRiwgb3V0LndpZHRoPSc4MCUnLCBmaWcuY2FwID0gIkh1bWUgZGlkIG1vcmUgdG8gc29ydCBvdXQgY2F1c2FsIGluZmVyZW5jZSB0aGFuIGFueSBvdGhlciB0aGlua2VyLiBUaGUgd2hvbGUgYXBwcm9hY2ggb2YgY2F1c2FsIGluZmVyZW5jZSBpcyBIdW1pYW4uIFdlIGFodmVuJ3Qgc29sdmVkIHRoZSBwcm9ibGVtLCBidXQgaGUnZCBiZSBwcm91ZCBvZiB3aGF0IHdlJ3ZlIGJ1aWx0LiBJdCBzaG93cyB0aGF0IGV4cGVyaW1lbnRzIGFyZW4ndCBuZWNlc3NhcnkuIFdlIGRvbid0IG5lZWQgdGhlbSBpZiB3ZSBjYW4gY2xvc2UgdGhlIGJhY2tkb29yIHBhdGhzLiBPZnRlbiBleHBlcmltZW50cyBpbiB0aGUgaHVtYW4gc2NpZW5jZXMgYXJlIGVpdGhlciBpbXByYWN0aWNhbCBvciB1bmV0aGljYWwgb3IgYm90aC4gTG90cyBvZiBwcm9ncmVzcyBjYW4gY29tZSBmcm9tIG9ic2VydmF0aW9uYWwgc3R1ZGllcy4gQWxzbywgaW50ZXJ2ZW50aW9ucyBpbmZsdWVuY2UgbWFueSB2YXJpYWJsZXMgYXQgb25jZS4gZS5nLiBleHBlcmltZW50YWxseSBtYW5pcHVsYXRlIG9ic2VzaXR5LiBDaG9vc2luZyBleGVyY2lzZSBvciBkaWV0IHdpbGwgYWZmZWN0IHdoYXQgeW91J3JlIG9ic2VydmluZy4gSHVnZSBhZHZhbnRhZ2Ugb2Ygb2JzZXJ2YXRpb25hbCBzdHVkaWVzLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMTEucG5nJykpCmBgYAoKCgpgYGB7ciwgZWNobyA9IEYsIG91dC53aWR0aD0nODAlJywgZmlnLmNhcCA9ICJUaGUgZmlyc3QgYWx0ZXJuYXRpdmUgdXNlcyB0aGUgZXhpc3RlbmNlIG9mIGEgbWVkaWF0b3IgdG8gcmVtb3ZlIGEgY29mb3VuZCBiZXR3ZWVuIGFuIGV4cG9zdXJlIGFuZCBhbiBvdXRjb21lLiBUaGUgc2Vjb25kIGlzIHVzZWQgYSBsb3QgaW4gYmVoYXZpb3VyYWwgZ2VuZXRpY3MgYW5kIGVjb25vbWljcy4gV2UnbGwgbGVhcm4gaG93IHRvIHVzZSB0aGVzZS4ifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlLnBhdGgoc2xpZGVzX2RpciwgJzEyLnBuZycpKQpgYGAKCgoKYGBge3IsIGVjaG8gPSBGLCBvdXQud2lkdGg9JzgwJScsIGZpZy5jYXAgPSAiU2hvdWxkbid0IGdldCBjb2NreS4gREFHcyBhcmUgaGV1cmlzdGljIG1vZGVscy4gU3RpbGwgYSBsb3Qgb2YgcmVzaWR1YWwgY29uZm91bmRpbmcuIFlvdSBjYW4gcHV0IG1lYXN1cmVtZW50IGVycm9yIGludG8gYSBEQUcuIFdlJ2xsIGdldCB0aGVyZSBuZWFyIHRoZSBlbmQuIFRoaXMgaXMgaW1wb3J0YW50IGlmIHlvdSdyZSBzYXkgYW4gYW50aHJvcG9sb2dpc3QsIGhhbGYgeW91ciBtZWFzdXJlbWVudHMgYXJlIGVycm9yLiBQaHlsb2dlbmV0aWMgdHJlZXM6IGJpZyBuZXN0IG9mIGVycm9yLiBMYXN0IGlzIHRoYXQgeW91IHNob3VsZG4ndCBsZXQgREFHcyBzdG9wIHlvdSBmcm9tIG1ha2luZyBhIHJlYWwgY2F1c2FsIG1vZGVsLiBQaHlzaWNpc3RzIGRvbid0IG5lZWQgREFHcyBiZWNhdXNlIHRoZXkgaGF2ZSByZWFsIG1vZGVscywgd2l0aCBjYXVzYWwgaW1wbGljYXRpb25zLiBUaGF0J3Mgd2hhdCB5b3Ugd2FudCB0byBkcml2ZSB0b3dhcmRzLiJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGUucGF0aChzbGlkZXNfZGlyLCAnMTMucG5nJykpCmBgYAoKCgoKCgo=